﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Estoque
{
    public partial class ComprarProduto : System.Web.UI.Page
    {
        ProdutoService servico = new ProdutoService();
        FornecedorService servico_fornecedor = new FornecedorService();
        LoginService servico_Login = new LoginService();
        
        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
           
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Compra)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Listar_Estoque)
            {
                btnVoltar.Visible = false;
            }

            if (!IsPostBack)
            {
                //limpa o chache existente para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Produtos");

                //Carrega os fornecedores cadastrados
                List<Fornecedor> fornecedores = servico_fornecedor.ListarFornecedoresCache();

                //Chama serviço que retorna todos os produtos
                List<Produto> produtos = servico.ListarProdutosCache();
               

                //popular o dropdown estados
                ddlProdutos.DataSource = produtos;
                ddlProdutos.DataTextField = "NomeProduto";
                ddlProdutos.DataValueField = "ID";
                ddlProdutos.DataBind();

                Fornecedor fornecedor = fornecedores.Where(i => i.ID == produtos[0].IDFornecedor).FirstOrDefault();
                
                //Preenche os textbox com o fornecedor do primeiro produto selecionado
                txtFornecedor.Text = fornecedor.NomeFornecedor;
                txtTelefone.Text = fornecedor.TelefoneFornecedor;
                txtEmailFornecedor.Text = fornecedor.EmailFornecedor;
                ckbPermitirEmail.Checked = produtos[0].PermitirEnvioEmail;
            }
        }

        /// <summary>
        /// Tenta salvar o produto no estoque no banco de dados
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtQuantidade.Text,
                txtPrecoCompra.Text
            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
            

            int ID = Convert.ToInt32(ddlProdutos.SelectedValue);
            int quantidade = Convert.ToInt32(txtQuantidade.Text);

            //objeto que controla o estoque
            EstoqueService servicoEstoque = new EstoqueService();

            //objeto que controla o balanco de despesa
            BalancoService servicoBalanco = new BalancoService();


           //monta o objeto despesa com a descricao necessaria
            try
            {
                Balanco_Financeiro despesa = new Balanco_Financeiro()
                {
                    Descricao = "Compra de "+ quantidade +" unidades do produto " + ddlProdutos.SelectedItem,                    
                    DataDespesa = DateTime.Now,                   
                    PrecoGasto = Convert.ToDouble(txtPrecoCompra.Text),
                    Receita = false
                   
                };
                
                //chama o serviço que insere o produto no banco de dados
                if (servicoEstoque.ComprarProduto(quantidade, ID))
                {
                    HttpContext.Current.Cache.Remove("Lista_Produtos_Estoque");
                }
                else
                {
                    MensagemJS("ERRO: Não foi possivel fazer o cadastro do produto");
                    return;
                }

                //chama o serviço que insere a despesa do produto no banco de dados
                if (servicoBalanco.CadastrarDespesa(despesa))
                {
                    MensagemJS("Cadastro de compra de produto realizado com sucesso!");
                }
                else
                {
                    MensagemJS("ERRO: Cadastro de compra de produto realizado com sucesso, porém houve um erro ao armazenar a despesa");
                    return;
                }
              
            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;

            }

            //Limpa todos os campos após o cadastro
            btnLimpar_Click(null, null);
            
        }

        /// <summary>
        /// Evento de selecao do dropdownlist usado para preencher os dados do fornecedor do produto
        /// </summary>
        protected void ddlProdutos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int ID = Convert.ToInt32(ddlProdutos.SelectedValue);

            //produto selecionado
            Produto produto = servico.ListarProdutosCache().Where(i=>i.ID == ID).FirstOrDefault();

            //fornecedor correspondente
            List<Fornecedor> fornecedores = servico_fornecedor.ListarFornecedoresCache();
            Fornecedor fornecedor = fornecedores.Where(i => i.ID == produto.IDFornecedor).FirstOrDefault();
                

            //Preenche os textbox com o fornecedor do produto selecionado
            txtFornecedor.Text = fornecedor.NomeFornecedor;
            txtTelefone.Text = fornecedor.TelefoneFornecedor;
            txtEmailFornecedor.Text = fornecedor.EmailFornecedor;
            ckbPermitirEmail.Checked = produto.PermitirEnvioEmail;
        }


        /// <summary>
        /// Limpa todos os campos
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtQuantidade.Text = null;
            txtPrecoCompra.Text = null;
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            //Redireciona para a pagina anterior
            Response.Redirect("~/Apresentacao/Estoque/ListarEstoque.aspx");
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
    }
}